package com.eupmt.lab3.persistence.ibatis.dao;

import com.eupmt.lab3.persistence.ibatis.dao.ibator.IbatorProducteDAOImpl;
import com.eupmt.lab3.domain.Producte;
import com.eupmt.lab3.exceptions.ProducteNoExisteixException;
import com.eupmt.lab3.persistence.ibatis.PersistenceManager;
import static com.eupmt.lab3.utils.Constants.*;
import com.eupmt.lab3.utils.Log;
import com.ibatis.sqlmap.client.SqlMapClient;
import java.sql.SQLException;

public class ProducteDAOImpl extends IbatorProducteDAOImpl implements ProducteDAO {
    
    private SqlMapClient sqlMapClient;
    private Log log = null;

    //Constructors
    public ProducteDAOImpl() {
        super();
        sqlMapClient    = PersistenceManager.getInstance().getSqlMapClient();
        log             = new Log();
    }

    // Metodes Dao
    public Producte  getProducteByNumSerie(String numserie) throws Exception {
        Producte producte = new Producte();
        producte.setNumserie(numserie);

        Producte productePersistent = null;
        try {
            productePersistent = (Producte)sqlMapClient.queryForObject("producte.getProducteByNumSerie", numserie);
            if (productePersistent == null) {
                throw new ProducteNoExisteixException();
            }
        }
        catch (SQLException sqle) {
            if (sqle.getErrorCode() == PRODUCTE_NO_EXISTEIX) {
                throw new ProducteNoExisteixException(sqle.getMessage());
            }
        }
        return productePersistent;
    }

    public void insertProducte(Producte prod) throws Exception {

        try {
            sqlMapClient.insert("producte.insert",prod);
        }
        catch (SQLException sqle) {
            if (sqle.getErrorCode() == PRODUCTE_JA_EXISTEIX) {
                throw new ProducteNoExisteixException();
            }
            log.infoLog("Insert SQLErrorCode:"+sqle.getErrorCode()+":");
        }
    }

    public void updateProducte(Producte prod) throws Exception {
        try {
            sqlMapClient.update("producte.update", prod);
        }
        catch (SQLException sqle) {
            if (sqle.getErrorCode() == PRODUCTE_NO_EXISTEIX) {
                throw new ProducteNoExisteixException(sqle.getMessage());
            }
            log.infoLog("Update SQLErrorCode:"+sqle.getErrorCode()+":");
        }
    }

    public void deleteProducte(Producte prod) throws Exception {
        
        try {
            sqlMapClient.delete("producte.delete", prod);
        }
        catch (SQLException sqle) {
            if (sqle.getErrorCode() == PRODUCTE_NO_EXISTEIX) {
                throw new ProducteNoExisteixException(sqle.getMessage());
            }
            log.infoLog("Update SQLErrorCode:"+sqle.getErrorCode()+":");
        }
    }

    public void saveProducte(Producte prod) throws Exception {
        log.infoLog("Producte a fer save: " + prod.getIdproducte());

        if (prod.getIdproducte() == UNDEFINED) {
            insertProducte(prod);
        } else {
            updateProducte(prod);
        }
    }

    public Producte getProducteByNumId(int idproducte) throws Exception {
       
        Producte p=new Producte();
        p.setIdproducte(idproducte);
        Producte productePersistent = null;
        try {
            productePersistent = (Producte)sqlMapClient.queryForObject("producte.getProducteById", p);
            if (productePersistent == null) {
                throw new ProducteNoExisteixException();
            }
        }
        catch (SQLException sqle) {
            if (sqle.getErrorCode() == PRODUCTE_NO_EXISTEIX) {
                throw new ProducteNoExisteixException(sqle.getMessage());
            }
        }
        return productePersistent;
    }
}